/*
 * dsm_creador_canales.cpp
 *
 *  Created on: Dec 15, 2013
 *      Author: m
 */

#include <fstream>
#include "DSMComun.h"
#include "MessageQueue.h"
#include "Sequence.h"
#include "ProcessAux.h"
#include "CPrinter.h"

using ipc::MessageQueue;
using ipc::CPrinter;

int main ( int argc, char* argv[] )
{
    MessageQueue<PedidoCreacionCanalDSM> colaPedidosCreacion =
            MessageQueue<PedidoCreacionCanalDSM>::get( DSM_IPC_BASEFILE, COLA_REQUEST_CREACION );
    MessageQueue<PedidoCreacionCanalDSM> colaRespuestaCreacion =
            MessageQueue<PedidoCreacionCanalDSM>::get( DSM_IPC_BASEFILE, COLA_REPLY_CREACION );

    CPrinter::setHeader( "dsm_creador_canales" );

    while ( true )
    {
        bool crearRecursos = true;
        std::string buffer;
        PedidoCreacionCanalDSM pedido;

        // espera pedidos de creacion de canales
        pedido = colaPedidosCreacion.get( 0 );
        CPrinter::printOut( "Creando recursos DSM para: %s(%d)", pedido.nombre, pedido.id );

        std::string nombreAgente( pedido.nombre );

        // Reviso si los recursos para ese usuario ya estan creados


        std::ifstream recursos( "recursos.dsm" );
        while ( recursos >> buffer )
        {
            if( buffer.compare( nombreAgente ) == 0 )
            {
                crearRecursos = false;
            }
        }
        recursos.close();

        if ( crearRecursos )
        {
            // Crea todos los ipcs locales y remotos necesarios para ese usuario de dsm
            try
            {
                MessageQueue<PedidoDSM>::create( nombreAgente   + "shm.ipc", COLA_PEDIDO_HOST  );
            }
            catch(...)
            {
                CPrinter::printErr( "Error: Ya existe el canal de PEDIDOS de %s", pedido.nombre );
            }

            try
            {
                MessageQueue<TokenDSM>::create( nombreAgente   + "shm.ipc", COLA_ENTREGA_HOST );
            }
            catch(...)
            {
                CPrinter::printErr( "Error: Ya existe el canal de ENTREGA de %s", pedido.nombre );
            }

            try
            {
                MessageQueue<TokenDSM>::create( nombreAgente + "shm.ipc", COLA_LIBERAR_HOST );
            }
            catch(...)
            {
                CPrinter::printErr( "Error: Ya existe el canal de LIBERAR de %s", pedido.nombre );
            }

            // Lanzar los procesos del agente
            Argv args;
            args.pushArg( nombreAgente );
            ProcessAux::launchProcess( "./dsmRequestor", 1, args );
            ProcessAux::launchProcess( "./dsmReleaser", 1,args );

            system( "touch canales.dsm" );
            std::ofstream file( "canales.dsm", std::ios_base::app );
            file << nombreAgente << std::endl;
            file.close();

            // Registra que los recursos del usuario ya estan creados
            system( "touch recursos.dsm" );
            std::ofstream recursos2( "recursos.dsm", std::ios_base::app );
            recursos2 << nombreAgente << std::endl;
            recursos2.close();
        }

        // avisa que el canal ya esta listo
        CPrinter::printOut( "Los recursos DSM para: %s(%d) estan listos", pedido.nombre, pedido.id );
        colaRespuestaCreacion.put( pedido.id, pedido );
    }

    return 0;
}
